package com.beans.beans_scopes;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class APP3 {
    public static void main(String[] args) {
        //1.获取spring的上下文
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        //2.使用上下文的getBean方法
        BeanScopesController beanScopesController = context.getBean("beanScopesController",BeanScopesController.class);
        BeanScopesController2 beanScopesController2 = context.getBean("beanScopesController2",BeanScopesController2.class);
        //3.调用他们两个类中的方法先调用前面一个再调用后面
        beanScopesController.getUser();
        System.out.println("a修改了 存入到spring中的user数据");
        beanScopesController2.getUser();
//原来的user:User{id=3, name='java'}
//现在的user:User{id=3, name='cat'}
//a修改了 存入到spring中的user数据
//B:  User{id=3, name='cat'}


//        这是因为 Bean 默认情况下是单例状态（singleton）
//        所有⼈的使⽤的都是同⼀个对象
//        使⽤单例可以很⼤程度上提⾼性能，
//        所以在 Spring 中 Bean 的作⽤域默认也是 singleton 单例模式
    }

//Bean 的 6 种 作用域
//Spring 容器在初始化⼀个 Bean 的实例时，同时会指定该实例的作⽤域。
//Spring有 6 种作⽤域
//最后四种是基于 Spring MVC ⽣效的
//1. singleton：单例作⽤域（默认）【共用一个对象】- Spring
//2. prototype：原型作⽤域（多例作⽤域）【每回拿到的对象，都是刚new的，未改变的。】- Spring
//3、request：请求作⽤域【针对每一次请求，都创建一个对象】- Spring MVC
//4、session：回话作⽤域【一个会话里面，会有一个对象，而且是共享的！】
//5、application：全局作⽤域【共享的】
//6、websocket：HTTP WebSocket 作⽤域【在 Spring WebSocket 项目中，才会涉及到的作用域类型】- 了解

//    单例作⽤域(singleton)和全局作⽤域(application)区别
//    singleton 是 Spring Core 的作⽤域；application 是 Spring Web 中的作⽤域；
//    singleton 作⽤于 IoC 的容器，⽽ application 作⽤于 Servlet 容器。


//    那我们如何修改作用域呢
//    在@Bean之前加上
//    @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)// prototype - 原型作用域
//    @Bean

}
